package rede.servidor;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import rede.Mensagem;

/**
 * @author tiagosn
 */
public class Servidor <T extends MostraDados> {
    private ArrayList<InfoCliente>          infoClientes;
    private HashMap<String, InfoCliente>    mapaInfoClientes;
    private ServerSocket                    serverSocket;
    private Thread                          recebeConexao;
    private T                               ui;

    public Servidor(T ui, int porta) throws IOException{
        this.ui = ui;
        infoClientes = new ArrayList<InfoCliente>();
        mapaInfoClientes = new HashMap<String, InfoCliente>();
        serverSocket = new ServerSocket(porta);

        recebeConexao = new Thread(new RecebeConexao(this));
        recebeConexao.start();
    }

    public void autenticarCliente(String login, Socket socket, ObjectInputStream entrada, ObjectOutputStream saida){
        InfoCliente infoNovoCliente = new InfoCliente(login, socket, entrada, saida);

        infoClientes.add(infoNovoCliente);
        mapaInfoClientes.put(login, infoNovoCliente);
    }

    public ServerSocket getServerSocket(){
        return serverSocket;
    }

    public void enviaMensagem(Mensagem mensagem){
        int cnt;

        for(cnt = 0; cnt < infoClientes.size(); ++cnt){
            try {
                infoClientes.get(cnt).getSaida().writeObject(mensagem);
            } catch (IOException ex) {
                continue; /// verificar depois
            }
        }
    }

    public void desconectarCliente(String login){
        InfoCliente infoCliente = (InfoCliente)mapaInfoClientes.remove(login);
        infoClientes.remove(infoCliente);
    }

    public void enviarListaUsuarios(){
        ArrayList<String> logins = new ArrayList<String>();
        int cnt;

        for(cnt = 0; cnt < infoClientes.size(); ++cnt){
            logins.add(infoClientes.get(cnt).getLogin());
        }

        for(cnt = 0; cnt < infoClientes.size(); ++cnt){
            try {
                infoClientes.get(cnt).getSaida().writeObject(logins);
            } catch (IOException ex) {
                continue; /// verificar depois
            }
        }
    }

    public void atualizarListaClientes() {
        ArrayList<String> logins = new ArrayList<String>();
        ArrayList<String> ips = new ArrayList<String>();
        int cnt;

        for(cnt = 0; cnt < infoClientes.size(); ++cnt){
            logins.add(infoClientes.get(cnt).getLogin());
            ips.add(infoClientes.get(cnt).getSocket().getInetAddress().toString());
        }
        ui.atualizarListaClientes(logins, ips);
    }
}
